---
id: dbcontext-start
title: 9.0 入门简要
sidebar_label: 9.0 入门简要 ✨
---

## 9.0.1 入门准备

:::note 入门条件

对 `EF/EFCore` 有一定基础了解，还未接触的可先看 [【EFCore 基础】](https://docs.microsoft.com/zh-cn/ef/core/)

:::

### 9.0.1.1 安装对应数据库包

在本章节所在的类别中，所有数据库操作功能均需要依赖 `EntityFramework Core` 框架，但 `Furion` 框架底层并未集成 `EntityFramework Core` 包，而是采用动态加载程序集方式自动载入。

所以，如需使用本大类数据库功能，需安装对应的 `EntityFramework Core` 数据库包：

- `SqlServer`：`Microsoft.EntityFrameworkCore.SqlServer` (支持 SqlServer 2005 +)
- `Sqlite`：`Microsoft.EntityFrameworkCore.Sqlite`
- `Cosmos`：`Microsoft.EntityFrameworkCore.Cosmos`
- `InMemoryDatabase`：`Microsoft.EntityFrameworkCore.InMemory`
- `MySql`
  - `Pomelo.EntityFrameworkCore.MySql`：(支持 MySql 5.x +)
  - `MySql.EntityFrameworkCore`：支持 (MySql 8.x +)
- `PostgreSQL`：`Npgsql.EntityFrameworkCore.PostgreSQL`
- `Oracle`：`Oracle.EntityFrameworkCore` （支持 Oracle 10 +）
- `Firebird`：`FirebirdSql.EntityFrameworkCore.Firebird`
- `Dm`：`Microsoft.EntityFrameworkCore.Dm`

:::tip 小知识

这些数据库包应该安装在 `Furion.EntityFramework.Core` 层。特殊情况需安装在 `Furion.Core` 层中，如 `Mysql` `HasCharset()` 配置。

:::

### 9.0.1.2 创建数据库上下文

```cs {7}
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;

namespace Furion.EntityFramework.Core
{
    [AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]
    public class DefaultDbContext : AppDbContext<DefaultDbContext>
    {
        public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
        {
        }
    }
}
```

:::important 特别注意

每一个数据库上下文都需继承 `AppDbContext<TDbContext, TDbContextLocator>` 基类，默认数据库的 `TDbContextLocator` 为 `MasterDbContextLocator`，无需显式编写。

非默认数据库则需显式继承并申明，如：`AppDbContext<OtherDbContext, OtherDbContextLocator>`。

:::

想了解更多可查阅 【[数据库上下文定位器](./dbcontext-locator)】 章节。

### 9.0.1.3 配置连接字符串

`Furion` 框架提供多种方式配置数据库连接字符串：

- `appsettings.json` 中配置

```json {2-3}
{
  "ConnectionStrings": {
    "Sqlite3ConnectionString": "Data Source=./Furion.db"
  }
}
```

- 自定义 `.json` 文件配置

```json {2-3}
{
  "ConnectionStrings": {
    "Sqlite3ConnectionString": "Data Source=./Furion.db"
  }
}
```

该方式和在 `appsettings.json` 的区别是自定义的 `.json` 文件不会自动添加到项目中，**须在 `Visual Studio` 中配置 `.json` 右键属性，设置 `复制` 输出目录为 `如果较新则复制`，生成操作为：`内容`。**

- `[AppDbContext]` 特性配置

```cs {1}
[AppDbContext("Data Source=./Furion.db", DbProvider.Sqlite)]
public class DefaultDbContext : AppDbContext<DefaultDbContext>
{
}
```

- 在注册上下文时配置

```cs {3-4}
services.AddDatabaseAccessor(options =>
{
    // options.AddDb<DefaultDbContext>(connectionString: "配置Key或连接字符串");
    options.AddDbPool<DefaultDbContext>(connectionString: "配置Key或连接字符串");
});
```

- 在 `DbContext` 中配置

```cs {12-14}
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;

namespace Furion.EntityFramework.Core
{
    public class DefaultDbContext : AppDbContext<DefaultDbContext>
    {
        public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
        {
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("连接字符串");
            base.OnConfiguring(optionsBuilder);
        }
    }
}
```

### 9.0.1.4 各类数据库连接字符串配置示例

- `Sqlite`：`Data Source=./Furion.db`
- `MySql`：`Data Source=localhost;Database=Furion;User ID=root;Password=000000;pooling=true;port=3306;sslmode=none;CharSet=utf8;`
- `SqlServer`：`Server=localhost;Database=Furion;User=sa;Password=000000;MultipleActiveResultSets=True;`
- `Oracle`：`User Id=orcl;Password=orcl;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))`
- `PostgreSQL`：`PORT=5432;DATABASE=postgres;HOST=127.0.0.1;PASSWORD=postgres;USER ID=postgres;`

### 9.0.1.5 注册数据库上下文

```cs {12-19} title="Furion.EntityFramework.Core\Startup.cs"
using Furion.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

namespace Furion.EntityFramework.Core
{
    [AppStartup(600)]
    public sealed class FurEntityFrameworkCoreStartup : AppStartup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            // 配置数据库上下文，支持N个数据库
            services.AddDatabaseAccessor(options =>
            {
                // 配置默认数据库
                options.AddDbPool<FurionDbContext>();

                // 配置多个数据库，多个数据库必须指定数据库上下文定位器
                options.AddDbPool<SqliteDbContext, SqliteDbContextLocaotr>();
            });
        }
    }
}
```

:::tip 了解更多数据库数据库注册方式

如需了解各种数据库及版本注册方式可查阅 【[多数据库注册章节](dbcontext-multi-database.mdx)】

:::

### 9.0.1.6 `Code First` 说明

:::important 特别注意

`Furion` 框架默认数据迁移的程序集为：`Furion.Database.Migrations`，所以如果您改了程序集名称或通过 `Nuget` 方式安装的 `Furion` 包，则需要配置迁移程序集名称：

```cs {4}
services.AddDatabaseAccessor(options =>
{
    options.AddDbPool<FurionDbContext>(DbProvider.Sqlite);
}, "存放迁移文件的项目名称");
```

另外，如果应用中配置了多个数据库上下文，那么所有的 `迁移命令` 都需要指定 `-Context 数据库上下文名称` 参数。如：

```shell
Add-Migration v1.0.0 -Context FurionDbContext
```

:::

## 9.0.2 反馈与建议

:::note 与我们交流

给 Furion 提 [Issue](https://gitee.com/dotnetchina/Furion/issues/new?issue)。

:::
